package ar.com.algotres.tpdos.model.controlador;

import java.util.ArrayList;
import java.util.List;

import ar.com.algotres.tpdos.model.aterrizable.Pista;
import ar.com.algotres.tpdos.model.aviones.Avion;
import ar.com.algotres.tpdos.model.aviones.EstadoAvion;
import ar.com.algotres.tpdos.model.fisica.AreaAterrizaje;
import ar.com.algotres.tpdos.model.fisica.Posicion;
import ar.com.algotres.tpdos.model.mapas.Mapa;

public class TorreDeControl implements ITorreDeControl {

	private Mapa mapa;
	private List<Avion> aviones;

	public TorreDeControl(Mapa mapa) {
		this.mapa = mapa;
		aviones = new ArrayList<Avion>();
	}

	public void agregarAvion(Avion avion) {
		aviones.add(avion);
	}

	public Boolean tienePistaValida(Avion avion) {
		Boolean tienePista = Boolean.FALSE;
		Pista unaPista = null;

		for (Pista pista : mapa.getPistas()) {
			for (AreaAterrizaje areaAterrizaje : pista.getAreasAterrizaje()) {
				if (areaAterrizaje.posicionEstaEnArea(avion.getPosicion())) {
					unaPista = pista;
					tienePista = Boolean.TRUE;
				}
			}
		}

		return tienePista && avion.puedeAterrizarEnPista(unaPista);

	}

	public Boolean huboColisiones() {
		for (Avion unAvion : aviones) {
			if (EstadoAvion.COLISIONADO.equals(unAvion.getEstado())) {
				return true;
			}
		}
		return false;
	}

	public int cantidadAvionesVolando() {
		int resultado = 0;

		for (Avion avion : aviones) {
			if (!avion.isAterrizado()) {
				resultado++;
			}
		}

		return resultado;
	}

	public List<Avion> getAviones() {
		return this.aviones;
	}

	public Mapa getMapa() {
		return mapa;
	}

	/**
	 * Devuelve una pista al azar de las que estan en el mapa.
	 * 
	 * @return Pista
	 */
	public Posicion obtenerPistaDeAterrizaje(Avion avion) {
		return mapa.randomPuntoDeAterrizaje(avion);
	}

}
